﻿<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>StringSplit</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../css/commands.css" rel="stylesheet" type="text/css">
<link href="../css/print.css" rel="stylesheet" type="text/css" media="print">
</head>
<body>

<h1>StringSplit</h1>

<p>使用指定的分隔符将一个字符串分割为一个字符串数组。</p>

<p class="CommandSyntax">StringSplit, OutputArray, InputVar [, Delimiters, OmitChars]</p>
<h3>参数 </h3>
<table border="1" width="100%" cellspacing="0" cellpadding="3" bordercolor="#C0C0C0">
  <tr> 
    <td>OutputArray</td>
    <td><p><a href="../misc/Arrays.htm">array/数组</a> 名，存储 <em>InputVar</em> 分割成的子字符串。例如，如果这个参数使用 MyArray ，那么变量 MyArray0 会存储分割出来的子字符串的数量（如果未能分割则是 0 ），MyArray1 会存储分割出来的第一个子字符串，MyArray2 会存储分割出来的第二个子字符串，以此类推。</p>
    <p>在一个 <a href="../Functions.htm">function/函数</a> 内，要创建一个全局数组而不是局部数组，需要在函数内将 MyArray0 <a href="../Functions.htm#Global">declare/声明</a> 为全局变量（反过来在设置了 <a href="../Functions.htm#AssumeGlobal">assume-global</a> 的函数中要创建一个局部数组则需要将 MyArray0 声明为局部变量）。</p></td>
  </tr>
  <tr> 
    <td width="15%">InputVar</td>
    <td width="85%">被分割的字符串变量名。不要在变量名外加百分号，除非你想使用变量中的 <em>内容</em> 作为变量名。注意：<em>InputVar </em> 不能与 <em>OutputArray</em> 中的变量重名。</td>
  </tr>
  <tr>
    <td>Delimiters</td>
    <td><p>分隔符。如果这个参数留空或省略，<em>InputVar</em> 中的每一个字符都将作为一个子字符串被分割。</p>
      <p>否则，<em>Delimiters</em> 可以包含一个或多个字符（区分大小写），每个字符都用来判断从哪里分割 <em>InputVar</em> 。因为分隔符不被认为是子字符串的一部分，所以分隔符不会存入 <em>OutputArray</em> 中。另外，如果在 <em>InputVar</em> 中，一对分隔符之间什么也没有，则相应的数组元素会被设置为空。</p>      
      <p>例如：`,（转义的逗号）可以将字符串按逗号分割。相似的，%A_Tab%%A_Space% 可以将 <em>InputVar</em> 按空格或制表符分割。</p>
      <p>如果需要使用一个字符串作为分隔符，而不是单个字符，首先使用 <a href="StringReplace.htm">StringReplace</a> 将文本中与字符串分隔符相同的内容替换为一个在文本中未出现过的字符。参考这个例子，它使用 &lt;br&gt; 作为分隔符：</p>
<pre>StringReplace, NewHTML, HTMLString, &lt;br&gt;, ``, All  <em>; 将所有 &lt;br&gt; 替换为重音符号。</em>
StringSplit, MyArray, NewHTML, ``  <em>; 再使用重音符号分割字符串。</em></pre></td>
  </tr>
  <tr>
    <td>OmitChars</td>
    <td><p>可选参数，一组字符（区分大小写）。分割出来的字符串数组中每一个元素的开头和结尾如果包含这些字符，这些字符将被移除。例如，如果 <em>OmitChars</em> 参数指定 %A_Space%%A_Tab% ，则所有数组元素中开头和结尾（中间的除外）的所有空格和制表符将被移除。</p>
    <p>如果 <em>Delimiters</em> 参数留空，则 <em>OmitChars</em> 表明哪些字符将从数组中移除。</p>
    <p>和其它命令的最后一个参数不同，逗号在 <em>OmitChars</em> 中需要转义（`,）。</p></td>
  </tr>
</table>

<h3>注意</h3>
<p>如果 <em>OutputArray</em> 指定的数组已存在，该命令会替换其中 N 个元素的值。N 是 <em>InputVar</em> 分割出来的子字符串数量。超过 N 之后的元素的值将不会被更改。因此，为了安全最好使用数组第一个元素（MyArray0）来判断到底产生了多少个数组元素。</p>
<p>空格和制表符会被保留，除非使用它们做分隔符。在 <a href="AutoTrim.htm">AutoTrim</a> 打开的情况下（默认打开），可以将变量赋值给自己来自动移除两端的空格和制表符。例如：MyArray1 = %MyArray1%</p>
<p>如果需要分割的字符串具有标准的 CSV（逗号分隔值）格式，可以使用 <a href="LoopParse.htm">parsing loop</a> 内置的 CSV 处理功能。</p>
<p>分割字符串之前需要将字符串排序的话，使用 <a href="Sort.htm">Sort</a> 命令。</p>
<p>如果你不需要将分割出来的子字符串存储在内存中的话，建议使用 <a href="LoopParse.htm">parsing loop</a> —— 特别是 <em>InputVar</em> 比较大的时候，这样将会节省大量内存。例如：</p>
<pre>Colors = red,green,blue
Loop, parse, Colors, `,
    MsgBox Color number %A_Index% is %A_LoopField%.</pre>
<h3>相关命令</h3>
<p><a href="LoopParse.htm">Parsing loop</a>, <a href="../misc/Arrays.htm">Arrays</a>, <a href="Sort.htm">Sort</a>, <a href="SplitPath.htm">SplitPath</a>, <a href="IfInString.htm">IfInString</a>, <a href="StringGetPos.htm">StringGetPos</a>, <a href="StringMid.htm">StringMid</a>, <a href="StringTrimLeft.htm">StringTrimLeft</a>, <a href="StringTrimLeft.htm">StringTrimRight</a>, <a href="StringLen.htm">StringLen</a>, <a href="StringLower.htm">StringLower</a>, <a href="StringLower.htm">StringUpper</a>, <a href="StringReplace.htm">StringReplace</a></p>
<h3>示例</h3>
<pre class="NoIndent">TestString = This is a test.
StringSplit, word_array, TestString, %A_Space%, .  <em>; 删除句号。</em>
MsgBox, The 4th word is %word_array4%.

Colors = red,green,blue
StringSplit, ColorArray, Colors, `,
Loop, %ColorArray0%
{
    this_color := ColorArray%a_index%
    MsgBox, Color number %a_index% is %this_color%.
}</pre>

</body>
</html>
